package com.cet.test.mt04.qz3;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @program: cet-practice
 * @description:
 * @author: 陈恩涛
 * @create: 2023-05-06 20:43
 **/
public class LazyIterator<T> implements Iterable<T> {

    private final  ValueLoader valueLoader;


    @Override
    public Iterator<T> iterator() {
        return new Itr();
    }

    public LazyIterator(ValueLoader valueLoader) {
        this.valueLoader = valueLoader;
    }

    private class Itr implements Iterator<T> {

        private List<T> values = new ArrayList<>();

        private long offset = 0;

        private int limit = 3;

        @Override
        public boolean hasNext() {

            // 第一次或者当前分页数据已经遍历完，需要加载分页数据
            if (offset % limit == 0) {
                values = valueLoader.load(offset, limit);
                // 没有加载到任何数据
                if (values == null || values.isEmpty()) {
                    return false;
                }
            }

            // 当一次加载的分页数据量小于limit时，遍历到该次分页最后一个元素时，即所有元素的终点

            return values.size() >= limit || values.size() != (int) (offset % limit);
        }

        @Override
        public T next() {
            T result = values.get((int) (offset % limit));
            offset ++;
            return result;
        }
    }

}
